home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / Tools / TWILIGHT / TL_SOURC.E / ASSEMBLE.R / ELEFANT.S < prev    next >
Encoding:
Text File  |  1993-09-13  |  45.6 KB  |  1,213 lines

  1.  
  2.  
  3. ; ------        Flederfanten   --------------------
  4. ; Das Flederfantenmodul für TwiLight.
  5. ; © 1993 by Delirium Arts
  6. ;
  7. ; Dieses Modul soll helfen, die Spriteroutine zu erklären
  8. ; Es wurde geschrieben mit dem TurboAss von Σ-Soft
  9. ; Einige Eigenheiten des TurboAss:
  10. ;              PART / ENDPART:
  11. ;                              Die Bereiche, die zwischen Part und Endpart
  12. ;                              Stehen, lassen sich mit dem TurboAss mit einem
  13. ;                              Klick zu einer Zeile zusammenfassen. Dies dient
  14. ;                              der Übersichtlichkeit von Programmen.
  15. ;                              Bei einem  Assembler, der dies nicht versteht,
  16. ;                              kann man die Parts und Endparts einfach streichen.
  17. ;              Labelnamen länger als 8 Zeichen und Umlaute:
  18. ;                              Hat Ihr Assembler damit Probleme, müssen sie sie
  19. ;                              leider umändern...
  20. ;
  21. ; Das Programm enthält im unteren Teil ein paar Unterroutinen,
  22. ; die in diesem Modul nicht gebraucht werden. Mit Ihnen können Sprites beim Konvertieren
  23. ; gespiegelt werden, sowie extra Masken nachgeladen werden.
  24. ; Allerdings sind diese, wie eigentlich das ganze Modul, nicht besonders optimiert.
  25.  
  26.  
  27.  
  28.                 OUTPUT 'C:\TLM\ELEFANT.TLM' ; Modul wird im Ordner TLM als ELEFANT.TLM gespeichert
  29.  
  30.                 >PART 'ACC-Struktur-EQUs'
  31. _tl_version     EQU 0           ; die infos, die das ACC liefert...
  32. _tl_handle      EQU 2           ; siehe Doku!
  33. _max_x          EQU 4
  34. _max_y          EQU 6
  35. _vscr_x         EQU 8
  36. _vscr_y         EQU 10
  37. _vscr_w         EQU 12
  38. _vscr_h         EQU 14
  39. _max_colors     EQU 16
  40. _palette        EQU 18
  41. _planes         EQU 20
  42. _raster_op      EQU 22
  43. _cpu            EQU 24
  44. _fpu            EQU 28
  45. _mch            EQU 32
  46. _snd            EQU 36
  47. _tl_reserved    EQU 40
  48. _tl_path        EQU 44
  49. _tl_screen_adr  EQU 48
  50. _tl_mem         EQU 52
  51. _tl_aes_global  EQU 56
  52. _tl_vdi_pb      EQU 60
  53. _tl_flags       EQU 64
  54. _tl_check       EQU 66
  55. _tl_dim_col     EQU 70
  56. _tl_mod_time    EQU 74
  57. _tl_set_col     EQU 78
  58. _tl_scrn_restore EQU 82
  59. _tl_wait        EQU 86
  60. _tl_snd_play    EQU 90
  61. _tl_snd_stop    EQU 94
  62. _tl_reserved2   EQU 98
  63. _tl_play_mouse  EQU 110
  64. _tl_scroll      EQU 114
  65. _tl_xset_col    EQU 118
  66. _tl_dither      EQU 122
  67. _tl_sprite_init EQU 126
  68. _tl_sprite      EQU 130
  69. _tl_convert     EQU 134
  70.  
  71.  
  72. screen          EQU 0
  73. colors          EQU 1
  74. vsyncs          EQU 2
  75.  
  76.  
  77. RAHMEN          EQU 0
  78. STRING          EQU 1
  79. BUTTON          EQU 2
  80. RADIO           EQU 3
  81. POPUP           EQU 4
  82. SLIDER          EQU 5
  83. ICON            EQU 6
  84. EX_BUTTON       EQU 10
  85. POPUP_2         EQU 11
  86. FREI            EQU 12
  87.  
  88.  
  89.  
  90.  
  91.                 ENDPART
  92.                 >PART 'GEMDOS-EQUs'
  93. Fcreate         EQU 60
  94. Fclose          EQU 62
  95. Fopen           EQU 61
  96. Fread           EQU 63
  97. Fseek           EQU 66
  98. Fwrite          EQU 64
  99. Fsetdta         EQU 26
  100. Fsfirst         EQU 78
  101. Fsnext          EQU 79
  102. Pexec           EQU 75
  103. Mshrink         EQU 74
  104. Mfree           EQU 73
  105. Malloc          EQU 72
  106.                 ENDPART
  107.  
  108.                 >PART 'Modulkopf'
  109.                 bra     modulstart      ; muß ein 4-Byte-Sprung sein!
  110. tl_macic:       DC.B "XTLM"
  111. version:        DC.W $10        ; Version 0.1
  112. min_acc_vers:   DC.W 0
  113.                 DXSET 24," "
  114. name:           DX.B 'Flederfanten'
  115. author:         DX.B 'Delirium Arts'
  116.  
  117. icon:           DC.W $1F,$F000,$01FF,$FF00
  118.                 DC.W $07E7,$FFC0,$0FD9,$FFE0
  119.                 DC.W $1FFE,$FFF0,$1FFF,$7FF8
  120.                 DC.W $3CFF,$7FF8,$3CFF,$7FFC
  121.                 DC.W $3FFF,$7FFC,$7FFF,$7FF4
  122.                 DC.W $7FFE,$FFF4,$7FFE,$FFF2
  123.                 DC.W $7FFD,$FFF2,$7FF3,$FFF2
  124.                 DC.W $7FFF,$FFF2,$7EFF,$FFF2
  125.                 DC.W $38FF,$FFE0,$38FF,$FFE0
  126.                 DC.W $18FF,$FFE0,$1CF9,$E7C0
  127.                 DC.W $0CF8,$07C0,$0CF8,$07C0
  128.                 DC.W $F8,$07C0,$F8,$07C0
  129.  
  130.  
  131.  
  132.  
  133.  
  134. mem_request:    DC.L 0          ; Speicheranforderung...
  135. flags:
  136.                 DC.W %1110111   ; Modul braucht Spriteroutine verändert Farben und Hintergrund.
  137.                 DC.L objekte
  138.  
  139. objekte:        DC.W ob_ende-objekte
  140.                 DC.L 0
  141.                 DC.L infotext
  142.                 DC.W 4
  143.                 DC.L objekte_rahmen
  144.                 DC.L farb_pop
  145.                 DC.L schwarz_weiß
  146.                 DC.L Sync
  147.  
  148.  
  149. objekte_slider: DC.W SLIDER     ; SLIDER (wo sind die EQUs???"
  150.                 DC.W 3          ; tastaturbedienbar, horizontal
  151.                 DC.L slider_routine
  152. D_anz:          DC.W 5          ; Default: 11 Objekte
  153.                 DC.W 1,1        ; Position
  154.                 DC.W 28         ; breit
  155.                 DC.W 15         ; 14 Elemente
  156.                 DC.W 1
  157.                 DC.W 1
  158.                 DC.W 15
  159.                 DC.L sl_mask
  160.                 DC.L sl_text
  161. sl_mask:        DC.B "__ Flederfanten",0
  162. sl_text:        DC.B "               ",0
  163.  
  164. schwarz_weiß:   DC.W BUTTON
  165.                 DC.W 0
  166.                 DC.L 0
  167. D_sw:           DC.W 0
  168.                 DC.W 1
  169.                 DC.W 7
  170.                 DC.L sw_txt
  171.  
  172.  
  173. Sync:           DC.W BUTTON
  174.                 DC.W 0
  175.                 DC.L 0
  176. D_vsync:        DC.W -1
  177.                 DC.W 1
  178.                 DC.W 9
  179.                 DC.L sync_txt
  180.  
  181.  
  182.  
  183.  
  184. objekte_rahmen: DC.W RAHMEN
  185.                 DC.W 0,1,32,3
  186.                 DC.L obj_txt
  187.                 DC.W 1
  188.                 DC.L objekte_slider
  189.  
  190.  
  191. farb_pop:       DC.W POPUP
  192.                 DC.W 0
  193.                 DC.L 0
  194. D_farbe:        DC.W 1
  195.                 DC.W 0,5
  196.                 DC.L farb_txt
  197.                 DC.W 7          ; 7 Paletten
  198.                 DC.L farbtexte
  199.  
  200.  
  201. ob_ende:        DC.L -1
  202.  
  203.  
  204. sw_txt:         DC.B "Schwarz-[Weiß darstellen",0
  205. sync_txt:       DC.B '[Bildsyncronisation',0
  206. obj_txt:        DC.B ' Zahl der Flederfanfen ',0
  207. farb_txt:       DC.B '[Flederfantenfarbe: ',0
  208. farbtexte:      DC.B '  Grau    ',0
  209.                 DC.B '  Lila    ',0
  210.                 DC.B '  Blau    ',0
  211.                 DC.B '  Rosa    ',0
  212.                 DC.B '  Grün    ',0
  213.                 DC.B '  Violett ',0
  214.                 DC.B '  Gelb    ',0
  215.                 EVEN
  216.  
  217. farbpaletten:   DC.L grau
  218.                 DC.L lila
  219.                 DC.L blau
  220.                 DC.L rosa
  221.                 DC.L grün
  222.                 DC.L violett
  223.                 DC.L gelb
  224.  
  225.  
  226.  
  227. infotext:
  228.                 DC.B "       Die Flederfanten",13,13
  229.                 DC.B "  Einstellbar ist ihre Zahl",13
  230.                 DC.B "  Auch ihre Farbe steht zur Wahl",13
  231.                 DC.B "  Und ihr einziges bestreben",13
  232.                 DC.B "  Ist's von rechz nach linx zu schweben",13
  233.                 DC.B "  Ihre Herkunft ist ungeklärt",13
  234.                 DC.B "  Und doch flattern sie unbeschwert",13
  235.                 DC.B "  Damit sich diese Wesen regen",13
  236.                 DC.B "  Einfach die Maus mal nicht bewegen",13,0
  237.  
  238.                 EVEN
  239.  
  240.  
  241.  
  242. slider_routine: cmpi.w  #1,D_anz
  243.                 bne.s   mehr_fleder
  244.                 move.b  #" ",sl_text+12
  245.                 move.b  #" ",sl_text+13
  246.                 rts
  247. mehr_fleder:
  248.                 rts
  249.  
  250.                 ENDPART
  251.                 >PART 'Objektausmaße'
  252.  
  253.  
  254. b_e1            EQU 112         ; Breite des Elefanten
  255. h_e1            EQU 76          ; Höhe des Elefanten
  256. l_e1            EQU b_e1/8*h_e1 ; Länge eines Elefanten
  257.  
  258.  
  259. l_ges           EQU l_e1*7      ; Länge von 7 Animationsstufen
  260.  
  261.                 ENDPART
  262.  
  263.  
  264. modulstart:     >PART 'Modulstart etc.'
  265. ; Definitionen:
  266. ; A6: Variablenpointer
  267.  
  268.                 BASE A6,varbase ; A6 wird als Variablenpointer initialisiert
  269.                 lea     varbase(PC),A6
  270.                 move.l  A0,tl_info(A6)  ; Die tl_info Struktur speichern
  271.                 move.w  _tl_handle(A0),vdi_handle(A6) ; handle eintragen
  272.                 move.l  _tl_check(A0),tl_check(A6)
  273.                 move.l  _tl_sprite(A0),tl_sprite(A6)
  274.                 move.l  _tl_dither(A0),tl_dither(A6)
  275.                 move.l  _vscr_x(A0),vscr_x(A6)
  276.                 move.l  _vscr_w(A0),vscr_w(A6)
  277.                 move.w  _max_colors(A0),max_colors(A6)
  278.                 move.l  SP,stackpointer(A6) ; Stackpointer sichern für's rausspringen
  279.                 ENDPART
  280. init:           >PART 'konvertiert objekte'
  281. ; Einsprung: nichts
  282.  
  283.                 bsr     tst_farbe       ; Testet, ob Farbe oder Monochrom. Besetzt D3 (Flag, ob Farbe oder Monochrom) richtig
  284.                 lea     bilder_pfad(A6),A1 ; Zeiger auf den Pfad der Bilder
  285.                 bsr     datei_pfad      ; bastelt den Pfad zusammen
  286.                 move.w  D_anz(A6),anz_objekte(A6) ; wieviele Flederfanten überhaupt
  287.                 subq.w  #1,anz_objekte(A6) ; wegen DBRA und so...
  288.                 move.l  #l_ges,D7       ; Soviel Speicher brauchen alle gemeinsam für 1 Plane
  289.                 move.w  #b_e1+32,D5     ; breitestes Objekt+ maximale Verscjiebung um 32 Pixel
  290.                 move.w  #h_e1+10,D6     ; höchstes Objekt+ maximale y-Verschiebung um 10 Pixel pro tl_sprite aufruf
  291.                 moveq   #0,D4           ; Flag: mit Maske
  292.                 bsr     konvertier_speicher ; Fordert den nötigen Speicher für die Bilder an
  293.                 beq.s   ende            ; nicht genügend Speicher
  294.                 movea.l D0,A2           ; Anfangsadresse, des Speicherblocks
  295.                 lea     ob_tree(PC),A0  ; Zeiger auf Spritestructur (noch leer)
  296.                 moveq   #0,D4           ; Flag: mit Restaurieren
  297.                 bsr     sprite_anmelden ; ruft tl_sprite_init() auf
  298.                 bne.s   ende            ; bei Fehler raus
  299.                 bsr     konvertieren    ; Konvertiert die Objekte
  300.                 bsr.s   init_objekte    ; setzt die Elefanten erstmals auf den Schirm
  301.  
  302.                 ENDPART
  303. main:           >PART 'eigentliche Hauptprogramm'
  304.  
  305.                 movea.l tl_sprite(A6),A4
  306.                 movea.l tl_check(A6),A5
  307.  
  308. hauptschleife:  move.w  anz_objekte(A6),D6 ; Anzahl der eingestellten Flederfanten-1
  309. schleife:       move.w  D6,D0           ; welche Nummer
  310.                 bsr.s   do_objekt       ; Flederfant bewegen
  311.                 tst.w   D_vsync         ; Ist synchronisation eingeschaltet?
  312.                 beq.s   end_schl
  313.                 btst    #0,D6           ; bei jedem 2.Flederfanten tl_check() aufrufen (mit Vsync)
  314.                 beq.s   end_schl
  315.                 jsr     (A5)
  316.                 bmi.s   ende
  317.  
  318. end_schl:       dbra    D6,schleife     ; alle Flederfanten abarbeiten
  319.                 tst.w   D_vsync         ; nochmal bei bedarf einen VSYNC (und tl_check() ) aufrufen
  320.                 bne.s   hauptschleife
  321.  
  322.                 jsr     (A5)
  323.                 bmi.s   ende
  324.  
  325.                 bra.s   hauptschleife
  326.  
  327.                 ENDPART
  328.  
  329. ende:           >PART 'zurück zu TwiLight-ACC'
  330.  
  331.                 move.l  speicher(A6),-(SP) ; hier meistens FEHLER!
  332.                 move.w  #Mfree,-(SP)
  333.                 trap    #1
  334.                 addq.l  #6,SP
  335.                 movea.l stackpointer(A6),SP
  336.                 moveq   #0,D0           ; alles OK
  337.                 rts
  338.                 ENDPART
  339.  
  340. ;--------------  Unterroutinen -------------------------------
  341.  
  342. init_objekte:   >PART 'initialisiert Objekte erstmals'
  343.  
  344.                 lea     ob_tree(PC),A5
  345.                 move.w  anz_objekte(A6),D0
  346.                 lea     sprite_daten+2(A6),A1
  347. init_ob_schl1:  move.w  D0,-(SP)
  348.                 bsr     posit_objekt
  349.                 move.w  (SP)+,D0
  350.                 move.l  A1,(A5)+
  351.                 lea     11*2(A1),A1     ; nächstes Objekt
  352.                 dbra    D0,init_ob_schl1
  353.                 move.l  #-1,(A5)+
  354.                 rts
  355.                 ENDPART
  356.  
  357. do_objekt:      >PART 'Zeichnet ein Objekt'
  358. ; Einsprung: D0 Nummer des Objekts, das getestet wird, ob es außerhalb des Bereichs ist
  359. ;            A4 Zeiger auf Spriteroutine
  360. ; Es wird ein neues Objekt initialisiert
  361.  
  362.  
  363. ; Einsprung für Set Objekt:
  364. ;            A1 Zeiger, wohin das neue Objekt zusammengebastelt wird
  365.  
  366.                 move.w  D0,-(SP)        ; welcher Flederfant
  367.                 jsr     (A4)            ; tl_sprite()
  368.                 movea.l D0,A1           ; Die Überschneidungsstruktur nach A1
  369.                 move.w  (SP)+,D0        ; Nummer wieder zurück und Stackkorrektur
  370.                 tst.w   (A1)            ; 1. Word testen: Ist der Flederfant noch auf dem Schirm?
  371.                 beq     do_objekt_ausspr ; Ja, Objekt ist gut sichtbar, also wieder zurück zur Aufrufenden Routine
  372.  
  373.                 lea     ob_tree(A6),A0  ; Flederfant ist außerhalb.
  374. ;                                         Dies kann 2 Gründe haben:
  375. ;                                            1. Flederfant hat den Schirm verlassen
  376. ;                                            2. Flederfant ist noch garnicht in den Schirm geflogen
  377.                 lsl.w   #2,D0           ; Nummer*4 für die Adresse des Flederfanten
  378.                 movea.l 0(A0,D0.w),A1   ; Zeigt auf die obj_struct des Flederfanten
  379.                 subq.w  #1,-2(A1)       ; Zähler, ob Objekt nur neu initialisiert wurde und desshalb außen ist...
  380.                 bgt.s   do_objekt_ausspr ; Objekt ist auf dem Weg in den Schirm. Also alles OK, normal zurück zur aufrufenden Routine
  381.  
  382. ; Einsprung A1 Zeiger, wohin der Konfigblock hinkommt...
  383.  
  384. set_objekt:     lea     objekte_array(A6),A2
  385.                 movea.l 2(A2),A2        ; Zeigt auf die Flederfanten
  386.                 bsr     random
  387.                 move.l  D0,D7           ; Puffern
  388.                 move.l  A2,16(A1)       ; Adresse Eintragen
  389.                 move.l  (A2),4(A1)      ; Breite Eintragen
  390.                 and.w   #%1111111,D7
  391.                 btst    #1,D7           ; Entscheiden, ob der Flederfant von Oben oder von rechts kommt.
  392.                 beq.s   von_rechts      ; zufällig von rechts
  393.  
  394.                 move.w  vscr_w(A6),D1
  395.                 muls    D7,D1
  396.                 lsr.w   #7,D1           ; D1 Wert zwischen 0 und max_y
  397.                 add.w   vscr_x(A6),D1
  398.                 move.w  vscr_y(A6),D2
  399.                 sub.w   #h_e1,D2        ; minus Höhe der Flederfanten
  400.                 bra.s   set_weiter
  401.  
  402. von_rechts:     move.w  vscr_h(A6),D2
  403.                 muls    D7,D2
  404.                 lsr.w   #7,D2
  405.                 add.w   vscr_y(A6),D2
  406.                 move.w  vscr_x(A6),D1
  407.                 add.w   vscr_w(A6),D1
  408. set_weiter:     move.w  D1,(A1)         ; x-Position eintragen
  409.                 move.w  D2,2(A1)        ; y-Position eintragen
  410.                 and.w   #%11,D0
  411.                 addq.w  #1,D0
  412.                 move.w  D0,D1
  413.                 neg.w   D0
  414.                 move.w  D0,8(A1)        ; Geschwindigkeit in x-Richtung
  415.                 move.w  D1,10(A1)       ;                 in y-Richtung
  416.                 moveq   #4,D0           ; wie oft wechseln
  417.                 sub.w   D1,D0           ; nach sovielen Aufrufen wechseln
  418.                 move.w  D0,12(A1)       ; wechseln nach soundsoviel mal
  419.                 move.w  #50,-2(A1)      ; 50 Bewegungen kann Objekt außerhalb sein, dann erst wir es gelöscht
  420.  
  421. do_objekt_ausspr:rts
  422.  
  423.  
  424.                 ENDPART
  425.  
  426. posit_objekt:   >PART 'Positioniert Objekt beliebig'
  427. ; Einsprung: A1 Zeiger auf Objektdaten
  428.  
  429.                 lea     objekte_array(A6),A2
  430.                 movea.l 2(A2),A2        ; Zeigt auf die Flederfanten
  431.                 bsr     random
  432.                 move.l  D0,D7           ; Puffern
  433.                 move.l  A2,16(A1)       ; Adresse Eintragen
  434.                 move.l  (A2),4(A1)      ; Breite Eintragen
  435.                 and.w   #%1111111,D7
  436.  
  437.                 move.w  vscr_w(A6),D1
  438.                 muls    D7,D1
  439.                 lsr.w   #7,D1           ; D1 Wert zwischen 0 und max_y
  440.                 add.w   vscr_x(A6),D1
  441.                 move.w  vscr_h(A6),D2
  442.                 muls    D7,D2
  443.                 lsr.w   #7,D2
  444.                 add.w   vscr_y(A6),D2
  445.                 move.w  D1,(A1)         ; x-Position eintragen
  446.                 move.w  D2,2(A1)        ; y-Position eintragen
  447.                 and.w   #%11,D0
  448.                 addq.w  #1,D0
  449.                 move.w  D0,D1
  450.                 neg.w   D0
  451.                 move.w  D0,8(A1)        ; Geschwindigkeit in x-Richtung
  452.                 move.w  D1,10(A1)       ;                 in y-Richtung
  453.                 moveq   #4,D0           ; wie oft wechseln
  454.                 sub.w   D1,D0           ; nach sovielen Aufrufen wechseln
  455.                 move.w  D0,12(A1)       ; wechseln nach soundsoviel mal
  456.                 move.w  #2,-2(A1)       ; 2 Bewegungen kann Objekt (Flederfant) außerhalb sein, dann erst wird es gelöscht
  457.                 rts
  458.  
  459.                 ENDPART
  460.  
  461.  
  462.  
  463.  
  464. tst_farbe:      >PART 'testet, ob Farbig oder sw'
  465. ; Einsprung: nichts
  466. ; Aussprung: D3=0 -> Farbe  D3 <>0  -> Monochrom
  467.  
  468.  
  469.                 movem.l D0-D2/A5,-(SP)
  470.                 moveq   #0,D3           ; Nehmen wir mal an, es wird Farbe gewünscht (D3 ist das Flag dafür)
  471.                 movea.l tl_info(A6),A5
  472.                 cmpi.w  #1,_planes(A5)  ; nur Monochrom?
  473.                 beq.s   set_sw          ; es ist monochrom
  474.                 tst.w   D_sw            ; In Farbe SW darstellen?
  475.                 bne.s   set_sw
  476.                 cmpi.w  #16,max_colors(A6) ; weniger als 16 Farben?
  477.                 bge.s   genügend_farben ; alles OK für Farbe
  478. set_sw:         moveq   #1,D3           ; D3 ist nun Flag für SW
  479.                 move.w  #1,darstell_planes(A6) ; nur 1 Plane darstellen
  480.                 bra.s   tst_farbe_ausspr
  481. genügend_farben:
  482.                 move.w  _planes(A5),darstell_planes(A6) ; alle Planes darstellen
  483. tst_farbe_ausspr:movem.l (SP)+,D0-D2/A5
  484.                 rts
  485.  
  486.  
  487.                 ENDPART
  488.  
  489. rand_3:         >PART 'liefert Zahl zw 0 und 2'
  490.  
  491.                 bsr.s   random
  492.                 and.w   #%1111,D0
  493.                 muls    #3,D0           ; D0 *3
  494.                 lsr.w   #4,D0
  495.                 lsl.w   #2,D0
  496.                 rts
  497.                 ENDPART
  498. random:         >PART 'liefert Zufallszahl in D0'
  499.                 movem.l D1-D4/A0-A4,-(SP)
  500.                 move.w  #$11,-(SP)
  501.                 trap    #14
  502.                 addq.l  #2,SP
  503.                 movem.l (SP)+,D1-D4/A0-A4
  504.                 rts
  505.                 ENDPART
  506.  
  507. konvertieren:   >PART 'konvertiert die Elefanten'
  508. ; EInsprung: A2 Zeiger auf Speicherbereich
  509. ;            D3 monochrom oder farbig
  510.  
  511.                 movem.l D0-A6,-(SP)
  512.                 moveq   #0,D1
  513.                 lea     objekte_array(A6),A5
  514.                 clr.w   (A5)+
  515. _flederfant:    lea     flederfant(PC),A0 ; Zeigt auf den ersten Flederfant
  516.                 move.l  A0,(A5)+
  517.                 addq.w  #1,objekte_array(A6)
  518.                 move.w  (A0)+,D5        ; breite und Höhe
  519.                 move.w  (A0)+,D6
  520.                 moveq   #7-1,D7
  521.                 addq.l  #2,A0
  522. fleder_schl1:   bsr     konvert_objekt
  523.                 move.l  D0,(A0)+        ; Adresse der Daten
  524.                 bsr     create_mask
  525.                 move.l  D0,(A0)+
  526.                 dbra    D7,fleder_schl1
  527.                 movem.l (SP)+,D0-A6
  528.                 rts
  529.  
  530.                 ENDPART
  531.  
  532.  
  533.  
  534.  
  535. ;--------------- Sprite Konvertierung --------------------------
  536.  
  537.                 >PART 'Erklärung'
  538. ;              Es muß klar sein, ob Monochrom oder Farbig (in D3)
  539. ;              Zuerst konvertier_speicher aufrufen. Damit hat man genügend Speicher
  540. ;              reserviert. D0 zeigt auf den Speicherblock, wo die Objekte mal
  541. ;              hinkommen. In unkonvert Adresse, wo die Sachen hingeladen werden.
  542. ;
  543. ;              Dann sprite_anmelden aufrufen. Routine ruft hauptächlich
  544. ;              tl_sprite_init auf.
  545. ;
  546. ;              Dann jeweils konvert_objekt aufrufen. Routine lädt selbst Ojekte
  547. ;              und konvertiert sie. In unkonvert bleiben die Originaldaten erhalten,
  548. ;              so daß nch eine Maske erzeugt werden kann, sowie die Objekte
  549. ;              gespiegelt werden können. Es werden nur die Daten konvertiert.
  550. ;              Einen Objektblock (2.Structur) muß selbst erzeugt werden.
  551. ;              Dazu steht jeweils in D0 die Adresse, wohin konvertiert, oder
  552. ;              gespiegelt oder die Maske erzeugt wurde.
  553.  
  554.  
  555.                 ENDPART
  556. sprite_anmelden:>PART 'ruft tl_sprite_init_auf'
  557. ; Einsprung:  in unkonvert(a6) Adresse des Speicherblocks
  558. ;             in unkonvert_länge(a6) länge des Speichers
  559. ;             A0 Zeiger auf Spritestructur (muß noch nichts drinnstehen)
  560. ;             D5 Breite des Größten Objekts samt Bewegung
  561. ;             D6 Höhe des Größten Objekts samt Bewegung
  562. ;             D3 Farbig (0) oder monochrom
  563. ;             D4 mit restaurieren(0) ohne (1)
  564.  
  565.                 movea.l tl_info(A6),A5
  566.  
  567.  
  568. ; Einsprung für die Sprite_init_routine:
  569. ;            4(sp).l  Zeiger auf Pufferspeicher
  570. ;            8(sp).l  länge des Pufferspeichers
  571. ;           12(sp).l  Zeiger auf die Objekte struktur
  572. ;           16(sp).w  x-Breite des größten Objekts
  573. ;           18(sp).w  y-Breite des größten Objekts
  574. ;           20(sp).w  Farbig (0) monochrom (1)
  575. ;           21(sp).w  mit restaurieren (0), ohne restaurieren (1)
  576.                 move.w  D4,-(SP)
  577.                 move.w  D3,-(SP)
  578.                 move.w  D6,-(SP)        ; Höhe
  579.                 move.w  D5,-(SP)        ; Breite
  580.                 move.l  A0,-(SP)
  581.                 move.l  unkonvert_länge(A6),-(SP)
  582.                 move.l  unkonvert(A6),-(SP)
  583.                 movea.l _tl_sprite_init(A5),A1
  584.                 jsr     (A1)            ; Initroutine aufrufen
  585.                 lea     20(SP),SP       ; Stackkorrectur
  586.                 tst.l   D0
  587.                 rts
  588.                 ENDPART
  589. konvertier_speicher:>PART 'fordert Speicher an'
  590.  
  591. ; Einsprung: D7 Länge des Speichers, den _alle_ Objekte zusammengezählt für 1 Plane benötigen
  592. ;            D5 x-Ausmaße des größten Objekts samt x-Bewegung
  593. ;            D6 y-Ausmaße des größten Objekts samt y-Bewegung
  594. ;            D3=1 -> Monochrom  d3=0 -> Farbig
  595. ;            D4=0 mit Maske    D4=1 ohne Maske
  596. ;            A6 varbase
  597. ;            in tl_info Adresse von tl_struct
  598. ; Aussprung: D0.l Adresse des Speicherblocks (0 -> nicht genügend Speicher), wo die konvertierten Objekte beginnen
  599. ;            in unkonvert(a6) Adresse des Speicherblocks, der zur Konvertierung benötigt wird...
  600. ;            in Speicher(a6) Adresse des Speicherblocks für Mfree
  601. ;            in unkonvert_länge(a6) Länge des unkonvert Speichers
  602.  
  603.  
  604.  
  605. ; Die Routine ruft die Sprite Speicheranforderungsroutine auf, um den Speicher in unkonvert(a6) zu erhalten
  606.  
  607. ; Einsprung für die tl_sprite_init() Routine:
  608. ;            4(sp).l  Zeiger auf Pufferspeicher
  609. ;            8(sp).l  länge des Pufferspeichers
  610. ;           12(sp).l  Zeiger auf die Objekte struktur
  611. ;           16(sp).w  x-Breite des größten Objekts
  612. ;           18(sp).w  y-Breite des größten Objekts
  613. ;           20(sp).b  Farbig (0) monochrom (1)
  614. ;           21(sp).b  mit restaurieren (0), ohne restaurieren (1)
  615.  
  616.                 movem.l D1-A6,-(SP)
  617.                 movea.l tl_info(A6),A5
  618.                 clr.w   -(SP)           ; mit restaurieren
  619.                 move.w  D3,-(SP)        ; monochrom oder Farbig
  620.                 move.w  D6,-(SP)        ; y-Ausmaße
  621.                 move.w  D5,-(SP)        ; x-Ausmaße
  622.                 clr.l   -(SP)           ; Wert egal
  623.                 clr.l   -(SP)           ; nachfragen, wieviel Speicher überhaupt benötigt wird
  624.                 clr.l   -(SP)
  625.                 movea.l _tl_sprite_init(A5),A1
  626.                 jsr     (A1)            ; Initroutine aufrufen
  627.                 lea     20(SP),SP       ; Stackkorrectur
  628.                 move.w  D5,D1           ; breite
  629.                 move.w  D6,D2           ; höhe
  630.                 lsr.w   #3,D1           ; in Bytes
  631.                 muls    D2,D1           ; D1 Anzahl der Bytes
  632.                 lsl.l   #2,D1           ; mal 4 Planes (in der Regel sind die Bilder mit 16 Farben=4 Planes gemalt)
  633.                 cmp.l   D1,D0           ; was braucht mehr Speicher? Spriteroutine oder das Initialisieren?
  634.                 bge.s   convert_speich_1 ; wenn die Spriteroutine mehr Speicher braucht (mehr Bitplanes z.b true color)
  635.                 move.l  D1,D0           ; Zum Laden braucht man mehr Speicher (z.B. in Monochrom)
  636. convert_speich_1:move.l D0,unkonvert_länge(A6) ; länge des Speichers
  637.                 move.l  D7,D6
  638.                 tst.w   D3              ; monochrom oder in Farbe?
  639.                 bne.s   convert_speich_2 ; bei Monochrom nicht mit den Planes multiplizieren
  640.                 muls    _planes(A5),D7  ; D7 nun länge des gesamten Speichers der Bilder (konvertiert)
  641. convert_speich_2:add.l  D7,D0           ; D0 nun gesammte Länge des benötigten Speichers
  642.                 tst.w   D4              ; mit Maske? (->  <>0)
  643.                 bne.s   convert_sp_3
  644.                 add.l   D6,D0           ; nochmal Länge für 1 Plane dazu für Maske
  645. convert_sp_3:   addq.l  #1,D0           ; damit immer eine gerade Zahl von Bytes da ist
  646.                 and.l   #$FFFFFFFE,D0   ; gerade machen
  647.                 move.l  D0,-(SP)        ; Speicher für alle Objekte
  648.                 move.w  #Malloc,-(SP)   ;
  649.                 trap    #1
  650.                 addq.l  #6,SP
  651.                 tst.l   D0              ; gab es genügend Speicher
  652.                 beq.s   convert_speich_ausspr ; nein
  653.                 move.l  D0,speicher(A6)
  654.                 move.l  D0,unkonvert(A6) ; Adresse eintragen
  655.                 movea.l D0,A2           ; Adresse des unkonvertierten Blocks
  656.                 move.l  unkonvert_länge(A6),D7 ; länge des unkonvertier-Blocks
  657.                 add.l   D7,D0           ; D0 nun adresse, wo die Konvertierten Objekte anfangen können
  658.                 tst.l   D0
  659. convert_speich_ausspr:movem.l (SP)+,D1-A6
  660.                 rts
  661.  
  662.  
  663.                 ENDPART
  664.  
  665. konvert_objekt: >PART 'lädt und konvertiert Objekt'
  666. ; Einsprung: A2 Zeiger auf Speicher, wohin das Objekt konvertiert wird
  667. ;            D5 Breite des Objekts in Pixel (vielfaches von 16)
  668. ;            D6 Höhe des Objekts in Pixel
  669. ;            D3=0 -> Farbig 1 -> Monochrom
  670. ;            D1 offset in der Datei
  671. ; Aussprung: A2 Zeiger hinter das Objekt
  672. ;            D1 Zeiger hinter das Objekt in der Datei
  673. ;            D0 Zeiger auf Speicher, wohin Konvertiert wurde
  674.  
  675.                 move.l  A2,D0           ; D0 Startadresse
  676.                 movem.l D0/D2-A1/A3-A6,-(SP)
  677.                 bsr     unkonvert_löschen
  678.                 movea.l tl_info(A6),A5
  679.                 movea.l unkonvert(A6),A3 ; wohin geladen wird
  680.                 move.w  D5,D0
  681.                 lsr.w   #3,D0           ; Anzahl der Bytes
  682.                 muls    D6,D0           ; Gesamtzahl eines Planes
  683.                 lsl.l   #2,D0           ; mal 4 Planes (bei 16 Farb Objekten)
  684.                 bsr     bload           ; lädt das Objekt
  685.                 movea.l unkonvert(A6),A3
  686.                 bsr     convert         ; konvertiert es (oder dithert es, abhängig von D3)
  687.                 movea.l _tl_check(A5),A5 ; tl_check aufrufen
  688.                 jsr     (A5)
  689.                 bmi     ende            ; und bei bedarf raus
  690.                 movem.l (SP)+,D0/D2-A1/A3-A6
  691.                 rts
  692.  
  693.                 ENDPART
  694.  
  695. create_mask:    >PART 'errechnet eine Maske'
  696. ; Einsprung: A2 Wohin die Maske kommt
  697. ;            unkonvert(a6) Zeiger auf Planes im Standartformat
  698. ;            D5 Breite des Objekts in Pixel
  699. ;            D6 Höhe des Objekts in Pixel
  700. ; Aussprung: A2 Zeigt hinter die Maske
  701. ;            D0 Adresse, wo die Maske steht
  702. ;            Das unkonvert Feld bleibt unberührt
  703.  
  704.                 move.l  A2,D0
  705.                 movem.l D0-A1/A3-A6,-(SP)
  706.                 move.w  D5,D7
  707.                 lsr.w   #4,D7           ; anzahl der Wörter in x
  708.                 muls    D6,D7           ; d7 offset zweier Planes
  709.                 move.l  D7,D0
  710.                 add.l   D0,D0
  711.                 movea.l unkonvert(A6),A3
  712.                 movea.l A3,A0           ; a0/a1/a3/a4 Zeigen auf die einzelnen Planes
  713.                 adda.l  D0,A0
  714.                 movea.l A0,A1
  715.                 adda.l  D0,A1
  716.                 movea.l A1,A4
  717.                 adda.l  D0,A4
  718.                 move.l  D7,D1           ; Schleifenzähler
  719. c_m_schl1:      move.w  (A0)+,D0
  720.                 or.w    (A1)+,D0
  721.                 or.w    (A3)+,D0
  722.                 or.w    (A4)+,D0        ; Maske aus 4 Planes aufgebaut
  723.                 move.w  D0,(A2)+        ; und Eintragen
  724.                 subq.w  #1,D1
  725.                 bne.s   c_m_schl1
  726.                 movea.l tl_check(A6),A0
  727.                 jsr     (A0)
  728.                 movem.l (SP)+,D0-A1/A3-A6
  729.                 rts
  730.                 ENDPART
  731. spiegel_objekt: >PART 'spiegelt und konvertiert Obj.'
  732. ; Einsprung: in Unkonvert stehen die Pixeldaten
  733. ;            A2 Zeiger auf Speicher, wohin das Objekt konvertiert wird
  734. ;            D5 Breite des Objekts in Pixel (vielfaches von 16)
  735. ;            D6 Höhe des Objekts in Pixel
  736. ;            D3=0 -> Farbig 1 -> Monochrom
  737. ; Aussprung: A2 Zeiger hinter das Objekt
  738. ;            D0 Zeiger, wo das Objekt steht
  739.  
  740.                 move.l  A2,D0
  741.                 movem.l D0-A6,-(SP)
  742.                 movea.l tl_info(A6),A5
  743.                 move.w  D5,D0
  744.                 lsr.w   #4,D0           ; Breite in Words
  745.                 movea.l unkonvert(A6),A0 ; Unkonvertierte Pixeldaten
  746.                 lea     spiegel_puffer(PC),A2 ; dorthin wird zwischengespiegelt
  747.                 adda.w  D0,A2
  748.                 adda.w  D0,A2           ; Zeigt ans Ende
  749.                 subq.w  #1,D0           ; wegen DBRA
  750.                 subq.w  #1,D6           ; wegen DBRA
  751.                 moveq   #4-1,D4         ; 4 Planes
  752. spiegel_planes: move.w  D6,-(SP)        ; Höhe puffern
  753. spiegel_loop3:  move.w  D0,D5           ; Breite in Words-1 Schleife pro Zeile
  754.                 movea.l A0,A1
  755. spiegel_loop1:  move.w  (A1)+,D1
  756.  
  757.                 REPT 16         ; 16 mal machen
  758.  
  759.                 lsl.w   #1,D1           ; Oberstes Bit ins x-Bit schiften
  760.                 roxr.w  #1,D7           ; von Oben reinrotieren dadurch wird es umgedreht
  761.  
  762.                 ENDR
  763.  
  764.                 move.w  D7,-(A2)        ; zurückschreiben
  765.                 dbra    D5,spiegel_loop1
  766.                 move.w  D0,D5           ; Breite in Words
  767. spiegel_loop2:  move.w  (A2)+,(A0)+     ; Zeile übertragen
  768.                 dbra    D5,spiegel_loop2
  769.                 dbra    D6,spiegel_loop3
  770.                 move.w  (SP)+,D6
  771.                 dbra    D4,spiegel_planes ; 4 mal das ganze
  772.                 movea.l tl_check(A6),A0
  773.                 jsr     (A0)
  774.                 bmi     ende
  775.                 movem.l (SP)+,D0-A6
  776.                 bsr.s   convert         ; und konvertieren
  777.                 rts
  778.  
  779. spiegel_puffer: DS.B 40         ; maximale Breite sind 320 Pixel (beliebig erweiterbar)
  780.  
  781.                 ENDPART
  782.  
  783. convert:        >PART 'Konvertiere Objekt'
  784. ; Eingaben: A2: zieladresse (genügend reservieren!!!)
  785. ;           D5: Breite des Objekts in Pixel
  786. ;           D6: Höhe des Objekts in Pxel
  787. ;           D3: 0-> Farbe (wenn möglich) 1-> Monochrom
  788. ;           in unkonvert sind die unkonvertierten Pixeldaten
  789. ;           dither_tabelle ist die Tabelle mit den Ditherfarbumrechnungszeug
  790. ; Aussprung: A2 zeigt auf die nächste Adresse
  791.  
  792.                 movem.l D0-A1/A3-A6,-(SP)
  793.                 movea.l tl_info(A6),A5  ; Zeiger auf die tl_info-struktur
  794.  
  795.                 tst.w   D_sw            ; Wurde im Dialog auf sw gestellt?
  796.                 bne.s   dithern         ; monochrom
  797.  
  798.                 pea     dither_tabelle(PC)
  799.                 move.w  #16,-(SP)       ; Elefanten haben 16 Farben
  800.  
  801.                 lea     farbpaletten(PC),A0
  802.                 move.w  D_farbe(PC),D0  ; welche Farbe wurde in den Einstellungen ausgewählt
  803.                 subq.w  #1,D0
  804.                 lsl.w   #2,D0
  805.                 move.l  0(A0,D0.w),-(SP) ; Zeiger auf die Farbtabelle
  806.  
  807.                 move.w  #4,-(SP)        ; Die Flederfanten haben 4 Planes
  808.                 move.w  D6,-(SP)        ; Höhe eines Flederfanten
  809.                 move.w  D5,-(SP)        ; Breite eines Flederfanten
  810.                 move.l  A2,-(SP)        ; Zieladresse
  811.                 move.l  unkonvert(A6),-(SP)
  812.                 movea.l _tl_convert(A5),A0
  813.                 jsr     (A0)            ; tl_convert()
  814.                 lea     24(SP),SP       ; Stackkorrektur
  815.                 movea.l D0,A2           ; wohin die Nächste Phase konvertiert wird
  816.                 bmi     ende            ; wenn D0<0 gab's einen Fehler, also raus
  817.                 movem.l (SP)+,D0-A1/A3-A6
  818.                 rts
  819.  
  820.  
  821. dithern:        move.l  unkonvert(A6),-(SP) ; tl_dither: Spriteadr
  822.                 move.l  A2,-(SP)        ;                Zieladr
  823.                 pea     dither_tabelle(A6) ;             Farbumrechnunxtabelle
  824.                 move.w  D5,-(SP)        ;                breite
  825.                 move.w  D6,-(SP)        ;                höhe
  826.                 move.w  #4,-(SP)        ;                planes
  827.  
  828.                 movea.l tl_dither(A6),A1
  829.                 jsr     (A1)
  830.                 bmi     ende            ; wärendessen aufgewacht
  831.                 lea     18(SP),SP
  832.                 lsr.w   #3,D5           ; anzahl der Bytes in x
  833.                 muls    D6,D5           ; Anzahl der Bytes in einem Plane
  834.                 adda.l  D5,A2           ; neue Adresse
  835.                 movem.l (SP)+,D0-A1/A3-A6
  836.                 rts
  837.  
  838.  
  839.                 ENDPART
  840.  
  841. unkonvert_löschen:>PART 'löscht gesamten unkonvert teil'
  842. ; Einsprung: nichts
  843. ; Aussprung: nichts
  844.  
  845.                 movem.l D7-A0,-(SP)
  846.                 movea.l unkonvert(A6),A0
  847.                 move.l  unkonvert_länge(A6),D7
  848.                 asr.l   #1,D7
  849. convert_lösch_1:clr.w   (A0)+
  850.                 subq.w  #1,D7
  851.                 bne.s   convert_lösch_1
  852.                 movem.l (SP)+,D7-A0
  853.                 rts
  854.                 ENDPART
  855. load_mask:      >PART 'lädt eine Maske rein'
  856. ; Einsprung:  A2 Wohin die Maske kommt
  857. ;             D1 offset in der Datei
  858. ;             D5 Breite in Pixel
  859. ;             D6 Höhe in Pixel
  860.  
  861.                 movem.l D0/D2-A1/A3-A6,-(SP)
  862.                 movea.l A2,A3           ;
  863.                 move.w  D5,D0
  864.                 lsr.w   #3,D0           ; Anzahl der Bytes
  865.                 muls    D6,D0           ; Gesamtzahl eines Planes
  866.                 add.l   D0,D1
  867.                 bsr.s   bload           ; lädt das Objekt
  868.                 movem.l (SP)+,D0/D2-A1/A3-A6
  869.                 rts
  870.                 ENDPART
  871. bload:          >PART 'Block-Load'
  872. ; Eingaben: D0: zu ladende Bytes
  873. ;           D1: Ab Byte D1 laden
  874. ;           A3: Startadresse
  875. ;           in Datei Zeiger auf vollständigen Dateinnamen mit Pfad
  876. ; Ausgaben: D1 position des nächsten Objekts in der Datei
  877. ;
  878.                 movem.l D0/D2-A6,-(SP)
  879.                 move.l  D0,D6           ; Länge sichern
  880.                 move.l  D1,D5
  881.                 clr.w   -(SP)           ; Fopen: nur lesen
  882.  
  883.                 move.l  datei(A6),-(SP) ; Zeiger auf Dateinamen
  884.                 move.w  #Fopen,-(SP)
  885.                 trap    #1
  886.                 addq.l  #8,SP
  887.                 move.w  D0,D7           ; Handle kopieren und gleichzeitig testen.
  888.                 bmi.s   datei_nicht_da  ; Fehler: dann zurück
  889.  
  890.                 clr.w   -(SP)           ; Fseek: ab Dateistart
  891.                 move.w  D7,-(SP)        ;        Handle
  892.                 move.l  D5,-(SP)        ;        Offset
  893.                 move.w  #Fseek,-(SP)    ;        Opcode
  894.                 trap    #1
  895.                 lea     $0A(SP),SP
  896.  
  897.                 add.l   D6,D5           ; neuer offset in der Datei
  898.  
  899.                 move.l  A3,-(SP)        ; Fread: Adresse...
  900.                 move.l  D6,-(SP)        ; Anzahl der zu lesenden Bytes...
  901.                 move.w  D7,-(SP)        ; handle
  902.                 move.w  #Fread,-(SP)
  903.                 trap    #1
  904.                 lea     $0C(SP),SP
  905.  
  906.  
  907.                 move.w  D7,-(SP)        ; Fclose: handle
  908.                 move.w  #Fclose,-(SP)
  909.                 trap    #1
  910.                 addq.l  #4,SP
  911.                 move.l  D5,D1           ; neuer offset
  912.                 moveq   #0,D0           ; n-Flag löschen
  913. bload_rts:      movem.l (SP)+,D0/D2-A6
  914.                 rts
  915.  
  916. datei_nicht_da: movea.l tl_info(A6),A5
  917.                 movea.l _tl_scroll(A5),A5
  918.                 pea     datei_txt(PC)
  919.                 move.w  #2,-(SP)        ; 2 mal
  920.                 jsr     (A5)
  921.                 bra     ende            ; und Raus aus dem Modul
  922.  
  923.  
  924.                 ENDPART
  925. datei_pfad:     >PART 'bastelt Vollständigen Namen'
  926. ; Einsprung: A1 Zeiger auf den Dateinamen
  927. ; Aussprung: in datei(a6) Zeiger auf den vollständigen Dateinamen
  928.  
  929.                 movem.l D0-A6,-(SP)
  930.                 movea.l tl_info(A6),A5
  931.                 movea.l _tl_path(A5),A2 ; Zeiger auf Pfadnamen
  932.                 move.l  A2,datei(A6)    ; Zeiger eintragen
  933.                 move.w  -2(A2),D0       ; länge des Dateipfads
  934.                 lea     0(A2,D0.w),A3
  935. pfad_schl:      move.b  (A1)+,(A3)+
  936.                 bne.s   pfad_schl
  937.                 movem.l (SP)+,D0-A6
  938.                 rts
  939.  
  940.                 ENDPART
  941.  
  942. ;-----------------------------------------------------------------
  943.  
  944.  
  945.  
  946.                 >PART 'VDI-Library'
  947. ;************************************************************************
  948. ;* Und das gleiche nochmal für die VDI-Funktionen                       *
  949. ;* D0 = Die Eingabeparameter                                            *
  950. ;*      Bit 24-31 = Opcode der Funktion                                 *
  951. ;*      Bit 16-23 = Länge des Intin-Arrays                              *
  952. ;*      Bit 8-15  = Identifikationsnummer für Unter-Opcodes             *
  953. ;*      Bit 0-7   = Anzahl der Einträge in ptsin                        *
  954. ;* Die Gerätekennung wird der Variable "gr_handle" entnommen.           *
  955. ;************************************************************************
  956. _vdi:           movem.l D1-A6,-(SP)
  957.                 lea     control+2(A6),A0
  958.                 clr.w   (A0)+           ;alle Parameter löschen
  959.                 clr.l   (A0)+
  960.                 clr.w   (A0)
  961.                 move.l  D0,-(SP)
  962.                 tst.b   (SP)            ;kein Opcode vorhanden? => Kurzformat
  963.                 addq.l  #4,SP
  964.                 bne.s   _vdi1
  965.                 move.b  D0,1-8(A0)      ;Funktionsnummer in den Bits 0-7
  966.                 bra.s   _vdi2           ;alle anderen Parameter sind 0!
  967. _vdi1:          move.b  D0,3-8(A0)      ;Anzahl der Einträge in ptsin
  968.                 lsr.w   #8,D0
  969.                 move.w  D0,10-8(A0)     ;Unter-Opcode
  970.                 swap    D0
  971.                 move.b  D0,7-8(A0)      ;Anzahl der Einträge in intin
  972.                 lsr.w   #8,D0
  973.                 move.w  D0,0-8(A0)      ;Funktionsnummer
  974. _vdi2:          move.w  vdi_handle(A6),12-8(A0) ;VDI-Handle
  975.                 lea     _vdi_pb(A6),A0
  976.                 move.l  A0,D1
  977.                 moveq   #$73,D0
  978.                 trap    #2
  979.                 moveq   #0,D0
  980.                 move.w  int_out(A6),D0  ;int_out[0]
  981.                 movem.l (SP)+,D1-A6
  982.                 rts
  983.  
  984. _vdi_pb:        DC.L control    ; Der VDI-Parameterblock
  985.                 DC.L int_in
  986.                 DC.L ptsin
  987.                 DC.L int_out
  988.                 DC.L ptsout
  989.                 ENDPART
  990.  
  991.                 DATA
  992.  
  993.  
  994.                 >PART 'objekt daten'
  995.  
  996.  
  997. flederfant:     DC.W b_e1,h_e1  ; Ausmaße
  998.                 DC.W 7-1        ; 7 Animationsstufen
  999.                 DS.L 7*2        ; Zeiger auf konvertiere Pixeldaten
  1000.  
  1001.  
  1002.                 ENDPART
  1003.  
  1004. grau:           >PART
  1005.                 DC.W 0,0,0
  1006.                 DC.W 142,142,142
  1007.                 DC.W 285,285,285
  1008.                 DC.W 428,428,428
  1009.                 DC.W 571,571,571
  1010.                 DC.W 714,714,714
  1011.                 DC.W 857,857,857
  1012.                 DC.W 1000,1000,1000
  1013.                 DC.W 1000,1000,857
  1014.                 DC.W 857,857,714
  1015.                 DC.W 714,714,571
  1016.                 DC.W 571,571,571
  1017.                 DC.W 428,428,428
  1018.                 DC.W 285,285,285
  1019.                 DC.W 857,0,0
  1020.                 DC.W 1000,0,0
  1021.                 ENDPART
  1022. lila:           >PART
  1023.                 DC.W 0,0,0
  1024.                 DC.W 285,142,285
  1025.                 DC.W 428,285,428
  1026.                 DC.W 571,428,571
  1027.                 DC.W 714,571,714
  1028.                 DC.W 857,714,857
  1029.                 DC.W 1000,857,1000
  1030.                 DC.W 1000,1000,1000
  1031.                 DC.W 1000,1000,857
  1032.                 DC.W 857,857,714
  1033.                 DC.W 714,714,571
  1034.                 DC.W 571,571,571
  1035.                 DC.W 428,428,428
  1036.                 DC.W 285,285,285
  1037.                 DC.W 857,0,0
  1038.                 DC.W 1000,0,0
  1039.                 ENDPART
  1040. blau:           >PART
  1041.                 DC.W 0,0,0
  1042.                 DC.W 0,0,285
  1043.                 DC.W 0,142,428
  1044.                 DC.W 0,285,571
  1045.                 DC.W 0,428,714
  1046.                 DC.W 0,571,857
  1047.                 DC.W 571,714,1000
  1048.                 DC.W 1000,1000,1000
  1049.                 DC.W 1000,1000,857
  1050.                 DC.W 857,857,714
  1051.                 DC.W 714,714,571
  1052.                 DC.W 571,571,571
  1053.                 DC.W 428,428,428
  1054.                 DC.W 285,285,285
  1055.                 DC.W 857,0,0
  1056.                 DC.W 1000,0,0
  1057.                 ENDPART
  1058. rosa:           >PART
  1059.                 DC.W 0,0,0
  1060.                 DC.W 285,0,142
  1061.                 DC.W 428,142,285
  1062.                 DC.W 571,285,428
  1063.                 DC.W 714,428,571
  1064.                 DC.W 857,571,714
  1065.                 DC.W 1000,714,857
  1066.                 DC.W 1000,1000,1000
  1067.                 DC.W 1000,1000,857
  1068.                 DC.W 857,857,714
  1069.                 DC.W 714,714,571
  1070.                 DC.W 571,571,571
  1071.                 DC.W 428,428,428
  1072.                 DC.W 285,285,285
  1073.                 DC.W 857,0,0
  1074.                 DC.W 1000,0,0
  1075.                 ENDPART
  1076. grün:           >PART
  1077.                 DC.W 0,0,0
  1078.                 DC.W 0,285,0
  1079.                 DC.W 142,428,142
  1080.                 DC.W 285,571,285
  1081.                 DC.W 428,714,428
  1082.                 DC.W 571,857,571
  1083.                 DC.W 714,1000,714
  1084.                 DC.W 1000,1000,1000
  1085.                 DC.W 1000,1000,857
  1086.                 DC.W 857,857,714
  1087.                 DC.W 714,714,571
  1088.                 DC.W 571,571,571
  1089.                 DC.W 428,428,428
  1090.                 DC.W 285,285,285
  1091.                 DC.W 857,0,0
  1092.                 DC.W 1000,0,0
  1093.  
  1094.                 ENDPART
  1095. gelb:           >PART
  1096.                 DC.W 0,0,0
  1097.                 DC.W 285,285,0
  1098.                 DC.W 428,428,0
  1099.                 DC.W 571,571,0
  1100.                 DC.W 714,714,142
  1101.                 DC.W 857,857,428
  1102.                 DC.W 1000,1000,714
  1103.                 DC.W 1000,1000,1000
  1104.                 DC.W 1000,1000,857
  1105.                 DC.W 857,857,714
  1106.                 DC.W 714,714,571
  1107.                 DC.W 571,571,571
  1108.                 DC.W 428,428,428
  1109.                 DC.W 285,285,285
  1110.                 DC.W 857,0,0
  1111.                 DC.W 1000,0,0
  1112.                 ENDPART
  1113. violett:        >PART
  1114.                 DC.W 0,0,0
  1115.                 DC.W 285,0,285
  1116.                 DC.W 428,0,428
  1117.                 DC.W 571,0,571
  1118.                 DC.W 714,0,714
  1119.                 DC.W 857,142,857
  1120.                 DC.W 1000,285,1000
  1121.                 DC.W 1000,571,1000
  1122.                 DC.W 1000,571,857
  1123.                 DC.W 1000,571,714
  1124.                 DC.W 1000,428,571
  1125.                 DC.W 571,571,571
  1126.                 DC.W 428,428,428
  1127.                 DC.W 285,285,285
  1128.                 DC.W 857,0,0
  1129.                 DC.W 1000,0,0
  1130.                 ENDPART
  1131.  
  1132.  
  1133.                 >PART 'Daten'
  1134.  
  1135.  
  1136. bilder_pfad:    DC.B 'daten\elefant.000',0
  1137. datei_txt:      DC.B 'Flederfanten benötigen im Ordner ''\TLM\DATEN\'' die Datei ''ELEFANT.000'', sonst fliegen sie nicht...            ',0
  1138.  
  1139.                 EVEN
  1140.  
  1141.                 ENDPART
  1142.  
  1143.  
  1144. dither_tabelle: DC.W 0          ; 0
  1145.                 DC.W 0          ; 1
  1146.                 DC.W 3          ; 2
  1147.                 DC.W 6          ; 3
  1148.                 DC.W 7          ; 4
  1149.                 DC.W 8          ; 5
  1150.                 DC.W 9          ; 6
  1151.                 DC.W 13         ; 7
  1152.                 DC.W 16         ; 8
  1153.                 DC.W 16         ; 9
  1154.                 DC.W 13         ; 10
  1155.                 DC.W 0          ; 11
  1156.                 DC.W 0          ; 12
  1157.                 DC.W 0          ; 13
  1158.                 DC.W 0          ; 14
  1159.                 DC.W 0          ; 15
  1160.  
  1161.  
  1162.  
  1163.                 BSS
  1164.                 RSBSS
  1165. varbase:        DS.L 1
  1166.  
  1167.  
  1168.                 >PART 'Variablen'
  1169. tl_info:        DS.L 1          ; Die Adressen der jeweiligen TwiLight-Struktur/Routinen
  1170. tl_check:       DS.L 1
  1171. tl_sprite:      DS.L 1
  1172. tl_dither:      DS.L 1
  1173. vscr_x:         DS.W 1
  1174. vscr_y:         DS.W 1
  1175. vscr_w:         DS.W 1
  1176. vscr_h:         DS.W 1
  1177. max_colors:     DS.W 1          ; Anzahl der Farben
  1178.  
  1179. stackpointer:   DS.L 1          ; Speicher für Stackpointer
  1180. unkonvert:      DS.L 1          ; Adressen der Speicherblöcke
  1181. unkonvert_länge:DS.L 1          ; länge des unkonvert Blocks
  1182. speicher:       DS.L 1          ; anfangsadresse des reservierten Speichers
  1183. darstell_planes:DS.W 1          ; wieviele Planes dargestellt werden
  1184. datei:          DS.L 1          ; Zeiger auf den Pfad mit Datei
  1185. unMFDB:         DS.W 20
  1186. z_MFDB:         DS.W 20
  1187.  
  1188.  
  1189.                 ENDPART
  1190.                 >PART 'modulvariablen'
  1191.  
  1192. anz_objekte:    DS.W 1          ; wieviele Objekte-1 erscheinen sollen
  1193. objekte_array:  DS.W 1
  1194.                 DS.L 30+2       ; 30 Objekte +2 Sicherheit...
  1195. sprite_daten:   DS.W 11         ; Ein Objekt ist 10+1 Wörter Lang
  1196.                 DS.W 11*30      ; maximal 30 Objekte gleichzeitig
  1197. ob_tree:        DS.L 33         ; Objektbaum mit Platz für 33 Objekte
  1198.  
  1199.  
  1200.  
  1201.                 ENDPART
  1202.                 >PART 'VDI-Lib BSS'
  1203.  
  1204. control:        DS.W 16
  1205. int_in:         DS.W 128
  1206. int_out:        DS.W 128
  1207. ptsin:          DS.W 128
  1208. ptsout:         DS.W 128
  1209. vdi_handle:     DS.W 1          ;Die Handle der TwiLight-Workstation
  1210.  
  1211.                 ENDPART
  1212.                 END
  1213.